part of '../repository.dart';

const _kPremiumAccessInfoDemoExpirationTimeKey = 'demo_expiration_time';
const _kPremiumAccessInfoPurchaseItemTypeKey = 'purchase_item_type';
const _kPremiumAccessInfoSubscriptionExpirationTimeKey = 'subscription_expiration_time';

class _PremiumAccessInfoDto extends Equatable {
  const _PremiumAccessInfoDto._internal({
    required this.demoExpirationTimeDto,
    required this.purchaseItemTypeDto,
    required this.subscriptionExpirationTimeDto,
  });

  final _TimeDto? demoExpirationTimeDto;
  final _PurchaseItemTypeDto? purchaseItemTypeDto;
  final _TimeDto? subscriptionExpirationTimeDto;

  @override
  List<Object?> get props {
    return [
      demoExpirationTimeDto,
      purchaseItemTypeDto,
      subscriptionExpirationTimeDto,
    ];
  }

  factory _PremiumAccessInfoDto.fromJson(Map<String, dynamic> json) {
    final purchaseItemTypeString = json[_kPremiumAccessInfoPurchaseItemTypeKey] as String?;

    _PurchaseItemTypeDto? purchaseItemTypeDto;

    if (purchaseItemTypeString != null) {
      purchaseItemTypeDto = _PurchaseItemTypeDto.fromString(purchaseItemTypeString);
    }

    final subscriptionExpirationTimeString =
        json[_kPremiumAccessInfoSubscriptionExpirationTimeKey] as String?;

    _TimeDto? subscriptionExpirationTimeDto;

    if (subscriptionExpirationTimeString != null) {
      subscriptionExpirationTimeDto = _TimeDto.fromString(subscriptionExpirationTimeString);
    }

    final demoExpirationTimeString = json[_kPremiumAccessInfoDemoExpirationTimeKey] as String?;

    _TimeDto? demoExpirationTimeDto;

    if (demoExpirationTimeString != null) {
      demoExpirationTimeDto = _TimeDto.fromString(demoExpirationTimeString);
    }

    return _PremiumAccessInfoDto._internal(
      purchaseItemTypeDto: purchaseItemTypeDto,
      subscriptionExpirationTimeDto: subscriptionExpirationTimeDto,
      demoExpirationTimeDto: demoExpirationTimeDto,
    );
  }

  factory _PremiumAccessInfoDto.fromEntity(PremiumAccessInfo premiumAccessInfo) {
    _PurchaseItemTypeDto? purchaseItemTypeDto;

    if (premiumAccessInfo.purchaseItemType != null) {
      purchaseItemTypeDto = _PurchaseItemTypeDto.fromEntity(premiumAccessInfo.purchaseItemType!);
    }

    _TimeDto? subscriptionExpirationTimeDto;

    if (premiumAccessInfo.subscriptionExpirationTime != null) {
      subscriptionExpirationTimeDto =
          _TimeDto.fromEntity(premiumAccessInfo.subscriptionExpirationTime!);
    }

    _TimeDto? demoExpirationTimeDto;

    if (premiumAccessInfo.demoExpirationTime != null) {
      demoExpirationTimeDto = _TimeDto.fromEntity(premiumAccessInfo.demoExpirationTime!);
    }

    return _PremiumAccessInfoDto._internal(
      purchaseItemTypeDto: purchaseItemTypeDto,
      subscriptionExpirationTimeDto: subscriptionExpirationTimeDto,
      demoExpirationTimeDto: demoExpirationTimeDto,
    );
  }

  Map<String, dynamic> toJson() {
    return {
      _kPremiumAccessInfoDemoExpirationTimeKey: demoExpirationTimeDto?.toString(),
      _kPremiumAccessInfoPurchaseItemTypeKey: purchaseItemTypeDto?.toString(),
      _kPremiumAccessInfoSubscriptionExpirationTimeKey: subscriptionExpirationTimeDto?.toString(),
    };
  }

  PremiumAccessInfo toEntity() {
    return PremiumAccessInfo(
      demoExpirationTime: demoExpirationTimeDto?.toEntity(),
      purchaseItemType: purchaseItemTypeDto?.toEntity(),
      subscriptionExpirationTime: subscriptionExpirationTimeDto?.toEntity(),
    );
  }
}
